/*

This file is part of Rooms3D.

Copyright (C) 2008 Pixecur Technologies Incorporated (Esotera).
Visit Esotera at http://www.esoteras3.com
 
Rooms3D is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
 
Rooms3D is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.
 
You should have received a copy of the GNU General Public License
along with Rooms3D; see the file COPYING.  If not, write to 
Pixecur Technologies, 213-31 Peet Street, St. John's, NL, A1B 3W8. 
 
Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
 
*/

package com.datasentinel.j3d.controls;

import java.util.Iterator;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;

public class ChangeEventSupport
{
    /**
     * Only one <code>ChangeEvent</code> is needed per button model
     * instance since the event's only state is the source property.
     * The source of events generated is always "this".
     */
    protected transient ChangeEvent changeEvent = null;
	/** A list of event listeners for this component. */
	protected Queue<ChangeListener> listenerList = new ConcurrentLinkedQueue<ChangeListener>();
	
	/**
	 * Adds an <code>ActionListener</code> to the button.
	 */
	public void addChangeListener(ChangeListener l)
	{
		listenerList.add(l);
	}

	/**
	 * Removes an <code>ActionListener</code> from the button. 
	 */
	public void removeChangeListener(ChangeListener l)
	{
		listenerList.remove(l);
	}

	public void fireStateChanged()
	{
		Iterator<ChangeListener> listeners = listenerList.iterator();
		while (listeners.hasNext())
		{
			// Lazily create the event:
			if (changeEvent == null)
			{
				changeEvent = new ChangeEvent(this);
			}
			listeners.next().stateChanged(changeEvent);
		}
	}
}
